home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / dfue / elcheapofax / printers / rcs / transfer.asm,v < prev   
Text File  |  1995-03-09  |  5KB  |  225 lines

  1. head    1.2;
  2. access;
  3. symbols
  4.     OCT93:1.2;
  5. locks;
  6. comment    @;; @;
  7.  
  8.  
  9. 1.2
  10. date    93.06.11.16.29.21;    author Rhialto;    state Exp;
  11. branches;
  12. next    1.1;
  13.  
  14. 1.1
  15. date    93.06.11.15.08.07;    author Rhialto;    state Exp;
  16. branches;
  17. next    ;
  18.  
  19.  
  20. desc
  21. @Transfer routine for HP_LaserJet and ElCheapoFax
  22. @
  23.  
  24.  
  25. 1.2
  26. log
  27. @First real RCS checkin
  28. @
  29. text
  30. @;
  31. ;  Modified for ElCheapoFax April 1993 Olaf 'Rhialto' Seibert.
  32. ;  Changes (c)Copyright 1993 Olaf Seibert
  33. ;; $Id
  34. ;; $Log$
  35. ;
  36. ; Copyright (c) 1992 Commodore-Amiga, Inc.
  37. ;
  38. ; This example is provided in electronic form by Commodore-Amiga, Inc. for
  39. ; use with the "Amiga ROM Kernel Reference Manual: Devices", 3rd Edition,
  40. ; published by Addison-Wesley (ISBN 0-201-56775-X).
  41. ;
  42. ; The "Amiga ROM Kernel Reference Manual: Devices" contains additional
  43. ; information on the correct usage of the techniques and operating system
  44. ; functions presented in these examples.  The source and executable code
  45. ; of these examples may only be distributed in free electronic form, via
  46. ; bulletin board or as part of a fully non-commercial and freely
  47. ; redistributable diskette.  Both the source and executable code (including
  48. ; comments) must be included, without modification, in any copy.  This
  49. ; example may not be published in printed form or distributed with any
  50. ; commercial product.  However, the programming techniques and support
  51. ; routines set forth in these examples may be used in the development
  52. ; of original executable software products for Commodore Amiga computers.
  53. ;
  54. ; All other rights reserved.
  55. ;
  56. ; This example is provided "as-is" and is subject to change; no
  57. ; warranties are made.    All use is at your own risk. No liability or
  58. ; responsibility is assumed.
  59. ;
  60. ;*********************************************************************
  61. ;
  62. ; Transfer routine for HP_LaserJet and ElCheapoFax
  63. ;
  64. ;*********************************************************************
  65.  
  66. ;    INCLUDE "exec/types.i"
  67.  
  68. ;    INCLUDE "intuition/intuition.i"
  69. ;    INCLUDE "devices/printer.i"
  70. ;    INCLUDE "devices/prtbase.i"
  71. ;    INCLUDE "devices/prtgfx.i"
  72.  
  73.     XDEF    _Transfer
  74.  
  75. pi_ColorInt    equ $18
  76. pi_ScaleX    equ $28
  77. pi_dmatrix    equ $30
  78. pi_width    equ $58
  79. pi_xpos     equ $6a
  80. pi_threshold    equ $6c
  81.  
  82. PCMBLACK    equ 3
  83. ce_SIZEOF    equ 4
  84.  
  85.     SECTION     printer,CODE
  86. _Transfer:
  87. ; Transfer(PInfo, y, ptr)
  88. ; struct PrtInfo *PInfo     4-7
  89. ; UWORD y;            8-11
  90. ; UBYTE *ptr;            12-15
  91. ;
  92.  
  93.     movem.l d2-d6/a2-a3,-(sp)       ;save regs used
  94.  
  95.     movea.l 32(sp),a0               ;a0 = PInfo
  96.     move.l    36(sp),d0               ;d0 = y
  97.     movea.l 40(sp),a1               ;a1 = ptr
  98.  
  99.     move.w    pi_width(a0),d1         ;d1 = width
  100.     subq.w    #1,d1            ;adjust for dbra
  101.  
  102.     move.w    pi_threshold(a0),d3     ;d3 = threshold, thresholding?
  103.     beq.s    grey_scale        ;no, grey-scale
  104.  
  105. threshold:
  106. ; a0 - PInfo
  107. ; a1 - ptr
  108. ; d0 - y
  109. ; d1 - width
  110. ; d3 - threshold
  111.  
  112.     eori.b    #15,d3            ;d3 = dvalue
  113.     movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  114.     move.w    pi_xpos(a0),d2          ;d2 = x
  115.     movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  116.  
  117. ; a0 - sxptr
  118. ; a1 - ptr
  119. ; a2 - ColorInt ptr
  120. ; a3 - dmatrix ptr (NOT USED)
  121. ; d0 - byte to set (x >> 3)
  122. ; d1 - width
  123. ; d2 - x
  124. ; d3 - dvalue
  125. ; d4 - Black
  126. ; d5 - sx
  127. ; d6 - bit to set
  128.  
  129. twidth_loop:
  130.     move.b    PCMBLACK(a2),d4         ;d4 = Black
  131.     addq.l    #ce_SIZEOF,a2        ;advance to next entry
  132.  
  133.     move.w    (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  134.  
  135.     cmp.b    d3,d4            ;render this pixel?
  136.     ble.s    tsx_end         ;no, skip to next pixel.
  137.     subq.w    #1,d5            ;adjust for dbra
  138.  
  139. tsx_render:                ;yes, render this pixel sx times
  140.     move.w    d2,d0
  141.     lsr.w    #3,d0            ;compute byte to set
  142.     move.w    d2,d6
  143.     not.w    d6            ;compute bit to set
  144.     bset.b    d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  145.  
  146.     addq.w    #1,d2            ;x++
  147.     dbf    d5,tsx_render        ;sx--
  148.     dbf    d1,twidth_loop        ;width--
  149.     bra.s    exit            ;all done
  150.  
  151. tsx_end:
  152.     add.w    d5,d2            ;x += sx
  153.     dbf    d1,twidth_loop        ;width--
  154.     bra.s    exit
  155.  
  156. grey_scale:
  157. ; a0 - PInfo
  158. ; a1 - ptr
  159. ; d0 - y
  160. ; d1 - width
  161.  
  162.     movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  163.     moveq.l #3,d2
  164.     and.w    d0,d2            ;d2 = y & 3
  165.     lsl.w    #2,d2            ;d2 = (y & 3) << 2
  166.     movea.l pi_dmatrix(a0),a3       ;a3 = dmatrix
  167.     adda.l    d2,a3            ;a3 = dmatrix + ((y & 3) << 2)
  168.     move.w    pi_xpos(a0),d2          ;d2 = x
  169.     movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  170.  
  171. ; a0 - sxptr
  172. ; a1 - ptr
  173. ; a2 - ColorInt ptr
  174. ; a3 - dmatrix ptr
  175. ; d0 - byte to set (x >> 3)
  176. ; d1 - width
  177. ; d2 - x
  178. ; d3 - dvalue (dmatrix[x & 3])
  179. ; d4 - Black
  180. ; d5 - sx
  181. ; d6 - bit to set
  182.  
  183. gwidth_loop:
  184.     move.b    PCMBLACK(a2),d4         ;d4 = Black
  185.     addq.l    #ce_SIZEOF,a2        ;advance to next entry
  186.  
  187.     move.w    (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  188.     subq.w    #1,d5            ;adjust for dbra
  189.  
  190. gsx_loop:
  191.     moveq.l #3,d3
  192.     and.w    d2,d3            ;d3 = x & 3
  193.     move.b    0(a3,d3.w),d3           ;d3 = dmatrix[x & 3]
  194.  
  195.     cmp.b    d3,d4            ;render this pixel?
  196.     ble.s    gsx_end         ;no, skip to next pixel.
  197.  
  198.     move.w    d2,d0
  199.     lsr.w    #3,d0            ;compute byte to set
  200.     move.w    d2,d6
  201.     not.w    d6            ;compute bit to set
  202.     bset.b    d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  203.  
  204. gsx_end
  205.     addq.w    #1,d2            ;x++
  206.     dbf    d5,gsx_loop        ;sx--
  207.     dbf    d1,gwidth_loop        ;width--
  208.  
  209. exit:
  210.     movem.l (sp)+,d2-d6/a2-a3       ;restore regs used
  211.     moveq.l #0,d0            ;flag all ok
  212.     rts                ;goodbye
  213.  
  214.     END
  215. @
  216.  
  217.  
  218. 1.1
  219. log
  220. @Initial revision
  221. @
  222. text
  223. @d4 2
  224. @
  225.